//
//  AppDelegate.swift
//  MintBag
//
//  Created by wy on 2024/8/23.
//

import UIKit
import AppsFlyerLib
import AppTrackingTransparency
import AdSupport

@main
class AppDelegate: UIResponder, UIApplicationDelegate, AppsFlyerLibDelegate {

    var window: UIWindow?
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        window = UIWindow(frame: UIScreen.main.bounds)
        window?.backgroundColor = .white
        window?.makeKeyAndVisible()
        
        setupUUID()
        loginStatusChanged()

        NotificationCenter.default.addObserver(self, selector: #selector(loginStatusChanged), name: NSNotification.Name(Const.loginStatusChanged), object: nil)

        if #available(iOS 14, *) {
          ATTrackingManager.requestTrackingAuthorization { (status) in
            switch status {
            case .denied:
                print("AuthorizationSatus is denied")
            case .notDetermined:
                print("AuthorizationSatus is notDetermined")
            case .restricted:
                print("AuthorizationSatus is restricted")
            case .authorized:
                // 用户授权，获取 IDFA
                let idfa = ASIdentifierManager.shared().advertisingIdentifier
                Const.idfa = idfa.uuidString
            @unknown default:
                fatalError("Invalid authorization status")
            }
          }
        }else {
            let idfa = ASIdentifierManager.shared().advertisingIdentifier
            Const.idfa = idfa.uuidString
        }

        AppsFlyerLib.shared().appsFlyerDevKey = "fvLjh3kJ98F3twNUG6zFcj"
        AppsFlyerLib.shared().appleAppID = "6736678447"
        AppsFlyerLib.shared().delegate = self
        let userId = KeychainStore.shared.string(forKey: .userId) ?? Const.idfa
        AppsFlyerLib.shared().customerUserID = userId
        AppsFlyerLib.shared().start() { res, err in
            Const.appsFlyerUID = AppsFlyerLib.shared().getAppsFlyerUID()
        }

        requestStaticLogic()
        
        return true
    }
    
    func setupUUID() {
        if (KeychainStore.shared.keychainString(forKey: .uuid) ?? "").isEmpty {
            KeychainStore.shared.setKeychainString(UUID().uuidString, key: .uuid)
        }
    }
    
    @objc func loginStatusChanged() {
        let userId = KeychainStore.shared.string(forKey: .userId) ?? ""
        window?.rootViewController = BaseNavigationController(rootViewController: userId.isEmpty ? LoginViewController(nibName: "LoginViewController", bundle: nil) : HomeViewController())
    }
    
    func requestStaticLogic() {
        let userId = KeychainStore.shared.string(forKey: .userId) ?? ""
        if userId.isEmpty {
            return
        }
        var version = "1.0.0"
        if let infoDictionary = Bundle.main.infoDictionary {
            if let versionString = infoDictionary["CFBundleShortVersionString"] as? String {
                version = versionString
            }
        }
        Http.shared.requestApi(.staticLogin(version: version)) { response in
            if (response["code"] as? Int) == 200 {
                if let data = response["data"] as? [String: Any], let userId = data["userId"] as? String, let sessionId = data["sessionId"] as? String {
                    KeychainStore.shared.setString(sessionId, key: .sessionId)
                    KeychainStore.shared.setString(userId, key: .userId)
                    if let jsonData = try? JSONSerialization.data(withJSONObject: data, options: .prettyPrinted), let jsonString = String(data: jsonData, encoding: .utf8) {
                        KeychainStore.shared.setString(jsonString, key: .userInfo)
                    }
                }
            }
        }
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
        requestVersion()
    }
    
    func requestVersion() {
        var version = "1"
        if let infoDictionary = Bundle.main.infoDictionary, let versionString = infoDictionary["CFBundleVersion"] as? String {
            version = versionString
        }
        Http.shared.requestApi(.getVersion) { [weak self] response in
            if (response["code"] as? Int) == 200, let data = response["data"] as? [String: Any], !data.keys.isEmpty, let code = data["code"] as? String, version != code {
                let must = data["must"] as? Int ?? 0
                let url = data["url"] as? String ?? ""
                let tips = data["tips"] as? String ?? ""
                let v = UpgradeView(frame: UIScreen.main.bounds)
                v.clickUpgrade = {
                    UIApplication.shared.open(URL(string: url)!)
                }
                if tips.isEmpty {
                    v.contentLabel.text = tips
                }
                v.cancelBtn.isHidden = must == 1
                v.closeBtn.isHidden = must == 1
                self?.window?.addSubview(v)
            }
        }
    }
    
    func onConversionDataSuccess(_ conversionInfo: [AnyHashable : Any]) {
        if let jsonData = try? JSONSerialization.data(withJSONObject: conversionInfo, options: .prettyPrinted), let jsonString = String(data: jsonData, encoding: .utf8) {
            Const.extensionS = jsonString
        }
    }
    
    func onConversionDataFail(_ error: any Error) {
        print(error)
    }
        
}

public extension UIDevice {

   var phoneModel: String {
       var systemInfo = utsname()
       uname(&systemInfo)
       let machineMirror = Mirror(reflecting: systemInfo.machine)
       let identifier = machineMirror.children.reduce("") { identifier, element in
           guard let value = element.value as? Int8 , value != 0 else { return identifier }
           return identifier + String(UnicodeScalar(UInt8(value)))
       }
       switch identifier {
       case "iPod5,1":                                 return "iPod Touch 5"
       case "iPod7,1":                                 return "iPod Touch 6"
       case "iPhone3,1", "iPhone3,2", "iPhone3,3":     return "iPhone 4"
       case "iPhone4,1":                               return "iPhone 4s"
       case "iPhone5,1", "iPhone5,2":                  return "iPhone 5"
       case "iPhone5,3", "iPhone5,4":                  return "iPhone 5c"
       case "iPhone6,1", "iPhone6,2":                  return "iPhone 5s"
       case "iPhone7,2":                               return "iPhone 6"
       case "iPhone7,1":                               return "iPhone 6 Plus"
       case "iPhone8,1":                               return "iPhone 6s"
       case "iPhone8,2":                               return "iPhone 6s Plus"
       case "iPhone8,4":                               return "iPhone SE (1st generation)"
       case "iPhone9,1", "iPhone9,3":                  return "iPhone 7"
       case "iPhone9,2", "iPhone9,4":                  return "iPhone 7 Plus"
       case "iPhone10,1", "iPhone10,4":                return "iPhone 8"
       case "iPhone10,5", "iPhone10,2":                return "iPhone 8 Plus"
       case "iPhone10,3", "iPhone10,6":                return "iPhone X"
       case "iPhone11,2":                              return "iPhone XS"
       case "iPhone11,4", "iPhone11,6":                return "iPhone XS MAX"
       case "iPhone11,8":                              return "iPhone XR"
       case "iPhone12,1":                              return "iPhone 11"
       case "iPhone12,3":                              return "iPhone 11 pro"
       case "iPhone12,5":                              return "iPhone 11 Pro Max"
       case "iPhone12,8":                              return "iPhone SE (2nd generation)"
       case "iPhone13,1":                              return "iPhone 12 mini"
       case "iPhone13,2":                              return "iPhone 12"
       case "iPhone13,3":                              return "iPhone 12 Pro"
       case "iPhone13,4":                              return "iPhone 12 Pro Max"
       case "iPhone14,4":                              return "iPhone 13 mini"
       case "iPhone14,5":                              return "iPhone 13"
       case "iPhone14,2":                              return "iPhone 13 Pro"
       case "iPhone14,3":                              return "iPhone 13 Pro Max"
       case "iPhone14,6":                              return "iPhone SE (3rd generation)"
       case "iPhone14,7":                              return "iPhone 14"
       case "iPhone14,8":                              return "iPhone 14 Plus"
       case "iPhone15,2":                              return "iPhone 14 Pro"
       case "iPhone15,3":                              return "iPhone 14 Pro Max"
       case "iPhone15,4":                              return "iPhone 15"
       case "iPhone15,5":                              return "iPhone 15 Plus"
       case "iPhone16,1":                              return "iPhone 15 Pro"
       case "iPhone16,2":                              return "iPhone 15 Pro Max"
       case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return "iPad 2"
       case "iPad3,1", "iPad3,2", "iPad3,3":           return "iPad 3"
       case "iPad3,4", "iPad3,5", "iPad3,6":           return "iPad 4"
       case "iPad6,11", "iPad6,12":                    return "iPad 5"
       case "iPad7,5", "iPad7,6":                      return "iPad 6"
       case "iPad7,11", "iPad7,12":                    return "iPad 7"
       case "iPad11,6", "iPad11,7":                    return "iPad 8"
       case "iPad12,1", "iPad12,2":                    return "iPad 9"
       case "iPad4,1", "iPad4,2", "iPad4,3":           return "iPad Air"
       case "iPad5,3", "iPad5,4":                      return "iPad Air 2"
       case "iPad11,3", "iPad11,4":                    return "iPad Air 3"
       case "iPad13,1", "iPad13,2":                    return "iPad Air 4"
       case "iPad13,16", "iPad13,17":                  return "iPad Air 5"
       case "iPad2,5", "iPad2,6", "iPad2,7":           return "iPad Mini"
       case "iPad4,4", "iPad4,5", "iPad4,6":           return "iPad Mini 2"
       case "iPad4,7", "iPad4,8", "iPad4,9":           return "iPad Mini 3"
       case "iPad5,1", "iPad5,2":                      return "iPad Mini 4"
       case "iPad11,1", "iPad11,2":                    return "iPad Mini 5"
       case "iPad14,1", "iPad14,2":                    return "iPad Mini 6"
       case "iPad6,7", "iPad6,8", "iPad6,3", "iPad6,4", "iPad7,1", "iPad7,2", "iPad7,3", "iPad7,4", "iPad8,1", "iPad8,2", "iPad8,3", "iPad8,4", "iPad8,5", "iPad8,6", "iPad8,7", "iPad8,8", "iPad8,9", "iPad8,10", "iPad8,11", "iPad8,12":         return "iPad Pro"
       case "AppleTV5,3":                              return "Apple TV"
       case "i386", "x86_64":                          return "Simulator"
       default:                                        return identifier
       }
   }
   
}


